package main

// $ go mod init github.com/zhangxi/rpc_goods
// $ ==> go mod init rpc_goods
// $ go mod tidy  #==> 下载项目中引入的第三方包,

import (
	"fmt"
	"net"
	"net/rpc"
)

// 创建远程调用的函数, 函数一般放在 struct 里面,
type Goods struct{}

// AddGoods 对应的结构体,
type AddGoodsReq struct {
	ID      int
	Title   string
	Price   float32
	Content string
}

type AddGoodsResp struct {
	Success bool
	Message string
}

func (this Goods) AddGoods(req AddGoodsReq, resp *AddGoodsResp) error {
	// 1.执行增加,
	fmt.Printf("%#v\n", req)
	// 返回结果,
	*resp = AddGoodsResp{Success: true, Message: "add success!"}
	return nil
}

// GetGoods 对应的结构体,
type GetGoodsReq struct {
	ID int
}

type GetGoodsResp struct {
	ID      int
	Title   string
	Price   float32
	Content string
}

func (this Goods) GetGoods(req GetGoodsReq, resp *GetGoodsResp) error {
	// 1.执行增加,
	fmt.Printf("%#v\n", req)
	// 返回结果,
	*resp = GetGoodsResp{ID: 12, Title: "GetGoodsRespData", Price: 24.55, Content: "IamServiceData"}
	return nil
}

func main() {
	// 1.注册 rpc 服务,
	err1 := rpc.RegisterName("goods_service", new(Goods))
	if err1 != nil {
		fmt.Println("rpc.RegisterName() err:", err1)
		return
	}
	// 2.监听端口,
	listener, err2 := net.Listen("tcp", "0.0.0.0:8000")
	if err2 != nil {
		fmt.Println("net.Listen() err:", err2)
		return
	}
	// 3.应用退出时候关闭监听端口,
	defer listener.Close()
	// 4.建立连接,
	for {
		fmt.Println("开始建立连接...")
		conn, err3 := listener.Accept()
		if err3 != nil {
			fmt.Println("listener.Accept() err:", err3)
			continue
		}
		// 5.绑定服务,
		go func() {
			rpc.ServeConn(conn)
		}()
	}
}
